package jvm.system;


import java.util.concurrent.CountDownLatch;

/***
 * 首先他俩都是退出程序的意思：
 *
 * 区别在于：system.exit（0）:正常退出，程序正常执行结束退出
 *
 *                    system.exit(1):是非正常退出，就是说无论程序正在执行与否，都退出，
 *
 *
 * System.exit(0)是将你的整个虚拟机里的内容都停掉了 ，而dispose()只是关闭这个窗口，但是并没有停止整个application exit() 。无论如何，内存都释放了！也就是说连JVM都关闭了，内存里根本不可能还有什么东西
 * System.exit(0)是正常退出程序，而System.exit(1)或者说非0表示非正常退出程序
 * System.exit(status)不管status为何值都会退出程序。和return 相比有以下不同点：return是回到上一层，而System.exit(status)是回到最上层

 3.示例
 在一个if-else判断中，如果我们程序是按照我们预想的执行，到最后我们需要停止程序，那么我们使用System.exit(0)，而System.exit(1)一般放在catch块中，当捕获到异常，需要停止程序，我们使用System.exit(1)。这个status=1是用来表示这个程序是非正常退出。
 */
public class SystemLearning {

    public static void main(String[] args) {
        int threadCount = 10;
        CountDownLatch cdl = new CountDownLatch( threadCount );
        for (int i=0; i < threadCount ; i++) {
            Thread t = new Thread(new MyThread(i, cdl));
            t.start();
            cdl.countDown();
        }
    }


    static class MyThread implements Runnable{

        public int i;

        public CountDownLatch cdl;

        public MyThread(int i, CountDownLatch cdl){
            this.i = i;
            this.cdl = cdl;
        }

        @Override
        public void run() {
            try {
                cdl.await();
                System.out.println(i + "启动@" + System.currentTimeMillis());
                if( i == 5 ){
                    System.exit(1);
                }else{
                    Thread.sleep(2000 );
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
